package tp1POO;

import java.util.Vector;

import tp1POO.Modelo.Cliente;
import tp1POO.Modelo.Funcionario;
import tp1POO.Modelo.Locacao;
import tp1POO.Modelo.Motorista;
import tp1POO.Modelo.ObjetoPOO;
import tp1POO.Modelo.Tipo;
import tp1POO.Modelo.Veiculo;
import tp1POO.Persistencia.GerenciadorObjetos;
import tp1POO.Persistencia.Pesquisa;

public class Interface {

	public static void clearScr() {
		for (int i = 0; i < 10; i++)
			System.out.println("");	
	}

	public static Integer opcao ()	{
		clearScr();
		System.out.println("1 - Cadastrar um novo Cliente");
		System.out.println("2 - Cadastrar um novo Funcionário");
		System.out.println("3 - Cadastrar um Veículo");
		System.out.println("4 - Cadastrar um novo tipo de locação");
		System.out.println("5 - Nova Locação");
		System.out.println("6 - Fechar uma Locação");
		System.out.println("7 - Remover um Cliente");
		System.out.println("8 - Remover um Funcionário");
		System.out.println("9 - Remover um Veículo");
		System.out.println("10 - Cadastrar um novo Motorista");
		System.out.println("11 - Remover um Motorista");
		System.out.println("12 - Pesquisa");
		System.out.println("\n0 - Sair");

		return Console.readInteger();
	}

	public static Integer pesquisas()	{
		clearScr();
		System.out.println("Seleciona uma das pesquisas abaixo:");
		System.out.println("\t 1 - Locações ainda em aberto");
		System.out.println("\t 2 - Locações finalizadas");
		System.out.println("\t 3 - Veículos disponíveis");
		System.out.println("\t 4 - Veículos mais procurados");
		System.out.println("\t 5 - Veículos mais rentáveis");
		System.out.println("\t 6 - Pesquisar Cliente");
		System.out.println("\t 7 - Pesquisa por disponibilidade de determinada categoria de veículos");

		return Console.readInteger();
	}

	public static Cliente cadastraCliente () {
		Cliente cliente = null;
		String nome=null, cpf=null;
		boolean erro = false;

		while (!erro) {
			clearScr();
			System.out.print("Digite o nome do cliente: ");
			nome = Console.readString();
			erro = Verifica.nomeCliente(nome) != null;
			if (!erro) continue;
			erro = false;
			System.out.print("Digite o CPF do cliente: ");
			cpf = Console.readString();
			erro = Verifica.cpfCliente(nome) == null;
			if (!erro) continue;
			cliente = new Cliente(nome, cpf);
			System.out.print("Digite o Endereço do cliente: ");
			cliente.setEndereco(Console.readString());
			System.out.print("Digite o Telefone do cliente: ");
			cliente.setTelefone(Console.readString());	
		}
		GerenciadorObjetos.obterInstancia().salvarObj(cliente);
		System.out.println("Cadastro realizado com sucesso!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return cliente;
	}

	public static Motorista cadastraMotorista()	{
		Motorista motorista = null;
		String nome, cpf, cnh;
		boolean erro = false;

		while (!erro) {
			clearScr();
			System.out.print("Digite o nome do motorista: ");
			nome = Console.readString();
			erro = (Verifica.nomeMotorista(nome).length()>0);
			if (!erro) continue;
			erro = false;
			System.out.print("Digite o CPF do motorista: ");
			cpf = Console.readString();
			erro = (Verifica.cpfMotorista(cpf).length()>0);
			if (!erro) continue;
			erro = false;
			System.out.print("Digite o CNH do motorista");
			cnh = Console.readString();
			erro = (Verifica.cnhMotorista(cnh).length()>0);
			if (!erro) continue;
			motorista = new Motorista(nome,cpf, cnh);
			System.out.print("Digite o Endereço do motorista: ");
			motorista.setEndereco(Console.readString());
			System.out.print("Digite o Teleone do motorista: ");
			motorista.setTelefone(Console.readString());
		}
		GerenciadorObjetos.obterInstancia().salvarObj(motorista);
		System.out.println("Cadastro realizado com sucesso!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return motorista;
	}

	public static Veiculo cadastraVeiculo() {
		Veiculo veiculo = null;
		String placa;
		int op=0;
		boolean erro = false;

		while (!erro) {
			clearScr();
			System.out.print("Digite a Placa do veículo: ");
			placa = Console.readString();
			erro = Verifica.placaVeiculo(placa) != null;
			if (!erro) continue;
			veiculo = new Veiculo(placa);
			System.out.print("Marca: ");
			veiculo.setMarca(Console.readString());
			System.out.print("Modelo: ");
			veiculo.setModelo(Console.readString());
			System.out.print("Cor: ");
			veiculo.setCor(Console.readString());
			System.out.print("Opcionais:");
			veiculo.setObservacoes(Console.readString());
			System.out.print("Observações:");
			veiculo.setObservacoes(Console.readString());
			while(op!=1 && op != 2){
				System.out.println("1 - Listar Tipos de locações já existentes");
				System.out.println("2 - Criar novo Tipo de locação");
				op = Console.readInteger();
				switch (op) {
				case 1: veiculo.setTipoVeiculo(escolheTipo()); break;
				case 2: veiculo.setTipoVeiculo(cadastraTipo()); break;
				}
			}

		}
		GerenciadorObjetos.obterInstancia().salvarObj(veiculo);
		System.out.println("Cadastro realizado com sucesso!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return veiculo;
	}

	public static Tipo cadastraTipo() {
		Tipo tipo;
		String nome;
		float taxa, prc;

		System.out.println("Qual é categoria?:");
		System.out.println("Nome:");
		nome = Console.readString();
		System.out.println("Taxa Base: ");
		taxa = Console.readFloat();
		System.out.println("Preço por Quilometro: ");
		prc = Console.readFloat();
		tipo = new Tipo(nome,prc,taxa);
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();
		GerenciadorObjetos.obterInstancia().salvarObj(tipo);

		return tipo;
	}

	public static Funcionario cadastraFuncionario() {
		Funcionario funcionario = null;
		String nome, cpf,cargo;
		boolean erro = false;

		while (!erro) {
			clearScr();
			System.out.print("Digite o nome do funcionario: ");
			nome = Console.readString();
			erro = (Verifica.nomeFuncionario(nome).length()>0);
			if (!erro) continue;
			erro = false;
			System.out.print("Digite o CPF do funcionario: ");
			cpf = Console.readString();
			erro = (Verifica.cpfFuncionario(cpf).length() > 0);
			if (!erro) continue;
			System.out.print("Digite o cargo do funcionário: ");
			cargo = Console.readString();
			funcionario = new Funcionario(nome,cpf,Funcionario.Cargo.valueOf(cargo));
			System.out.print("Digite o Endereço do funcionario: ");
			funcionario.setEndereco(Console.readString());
			System.out.print("Digite o Teleone do funcionario: ");
			funcionario.setTelefone(Console.readString());
		}
		GerenciadorObjetos.obterInstancia().salvarObj(funcionario);
		System.out.println("Cadastro realizado com sucesso!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return funcionario;
	}

	public static Locacao criaLocacao () {
		Veiculo veiculo = null;
		Integer numMotorista;
		Cliente cliente;
		int x;
		Motorista mot = null;
		Locacao locacao;

		//************************Verifica se o cliente a fazer a locação existe**************************************
		cliente = pesquisaCliente();
		if (cliente == null) {
			while (cliente == null)	{
				System.out.println("1 - Cadastrar o novo cliente");
				System.out.println("2 - Selecionar outro cliente");
				int op = Console.readInteger();
				switch (op){
				case 1: cliente = cadastraCliente(); break;
				case 2: cliente = pesquisaCliente(); break;
				}
			}
		}



		//*************************************************************************************************************
		//************************************Pede os dados restantes da locação para o usuário************************
		System.out.println("Escolha uma das opções:");
		while (veiculo == null) {
			System.out.println("1 - Cadastrar um novo veículo");
			System.out.println("2 - Pesquisar um veículo");
			System.out.println("3 - Listar veículos disponíveis");
			int op = Console.readInteger();
			if (op== 1) 
				veiculo = cadastraVeiculo();
			else if (op == 2)
				veiculo = pesquisaVeiculo();
			else if (op == 3)
				veiculo = escolheVeiculo();

		}
		//**************************************Informações adicionais*************************************
		locacao = new Locacao(veiculo, cliente);
		System.out.println("Previsão de Dias: ");
		int tmp = Console.readInteger();
		locacao.setPrevisaoDias(tmp);
		char tp = ' ';
		while (tp != 'l' && tp != 'L' && tp != 'Q' && tp != 'q') {
			System.out.print("Tipo de Locação (Livre - L, Quilometragem - Q): ");
			tp = Console.readChar();
		}
		locacao.setTipoLocacao(String.valueOf(tp));
		System.out.println("Km de Saida: ");
		tmp = Console.readInteger();
		tmp = Console.readInteger();
		locacao.setKmSaida(tmp);

		//************************************Motoristas**************************************
		System.out.print("Digite quantos motoristas serão registrados: ");
		numMotorista = Console.readInteger();
		for (x=0; x < numMotorista; x++)	{
			mot = null;
			while (mot == null)	{
				System.out.println("1 - Cadastrar o novo motorista");
				System.out.println("2 - Listar motoristas");
				System.out.println("3 - Pesquisar Motorista");
				int op = Console.readInteger();
				if (op == 1) 
					mot = cadastraMotorista();
				else if (op == 2)
					mot = escolheMotorista();
				else if (op == 3)
					mot = pesquisaMotorista();

			}
			mot.setLocacao(locacao);
		}

		if (numMotorista == 0) {
			mot = Pesquisa.ObterMotoristaNome(cliente.getNome());
			if (mot == null) {
				System.out.print("Digite o CNH do motorista/cliente:");
				String cnh = Console.readString();
				mot = new Motorista(cliente,cnh);
				mot.setCnh(cnh);
				mot.setCpf(cliente.getEndereco());
				mot.setEndereco(cliente.getEndereco());
				mot.setNome(cliente.getNome());
				mot.setTelefone(cliente.getTelefone());
			}
			mot.setLocacao(locacao);
		}

		Locacao locTemp;
		locTemp = Pesquisa.ObterLocacao(locacao.getLocador().getNome(), locacao.getVeiculo().getPlaca(), locacao.getDataSaida());
		if (locTemp == null) {
			GerenciadorObjetos.obterInstancia().salvarObj(locacao);
		}
		else {
			System.out.println("Locação já existe!");
			return null;
		}
		System.out.println("Cadastro de locacao realizado com sucesso!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return locacao;
	}

	public static boolean fechaLocacao()	{
		String nome, data, placa;
		int km;

		clearScr();
		System.out.print("Digite o nome do cliente: ");
		nome = Console.readString();
		System.out.print("Digite a placa do veículo: ");
		placa = Console.readString();
		System.out.println("Digite a data de inicio da locação: ");
		data = Console.readString();
		Locacao loc = Pesquisa.ObterLocacao(nome, placa, data);
		if (loc != null) {
			System.out.println("Digite o km de entrada");
			km = Console.readInteger();
			loc.setKmEntrada(km);
			if (loc.fecharLocacao())
				Verifica.dependenciaLocacao(loc);
		}
		else {
			System.out.println("Locação não existe!");
			System.out.println("\n-- Pressione ENTER para continuar --");
			Console.readChar();
			return false;
		}
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return true;
	}

	public static Cliente pesquisaCliente(){
		String nome;
		Cliente cl;

		System.out.print("Digite o nome do cliente (previamente cadastrado): ");
		nome = Console.readString();
		cl = Pesquisa.ObterClienteNome(nome);
		if (cl == null) {
			System.out.println("Cliente não existe");
			return null;
		}

		return cl;
	}

	public static Motorista pesquisaMotorista () {
		String cnh;
		Motorista mot;

		System.out.print("Digite o CNH do motorista(previamente cadastrado): ");
		cnh = Console.readString();
		//		mot = pesquisa.ObterMotorista(cnh);
		mot = Pesquisa.ObterMotoristaCnh(cnh);
		if (mot==null) {
			System.out.println("Motorista com CNH "+cnh+" não existe!");
			return null;
		}
		else if (mot.getLocacao() != null) {
			System.out.println("Esse motorista já possui uma locação pendente!");
			return null;
		}
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return mot;
	}

	public static Motorista escolheMotorista () {
		int i=0;
		Motorista mot = new Motorista(" ");
		Vector<ObjetoPOO> vetMot = GerenciadorObjetos.obterInstancia().obterObjs(mot);
		boolean erro = true; 

		if (!vetMot.isEmpty())	{
			System.out.println("\t -> Escolha um dos motoristas: ");
			while (erro) {
				for (ObjetoPOO motorista : vetMot){
					System.out.println(++i + "- " + ((Motorista)motorista).getNome() + ": " + ((Motorista)motorista).getCNH());
				}
				int motN = Console.readInteger();
				try {mot = (Motorista)vetMot.get(motN-1);} catch (Exception e) {}
				if (motN > vetMot.size()) {
					System.out.println("Motorista não existe!");
					i=0;
				}
				else if (mot.getLocacao() != null) {
					System.out.println("Esse motorista já possui uma locação pendente!");
					i=0;
				}
				else erro = false;
			}
		}
		else {
			System.out.println("Não existe nenhum motorista cadastrado");
			System.out.println("Cadastro de motorista:");
			mot = cadastraMotorista();
		}

		return mot;
	}

	public static Cliente escolheCliente() {
		int i=0;
		Cliente cl = new Cliente();
		Vector<ObjetoPOO> vetCl = GerenciadorObjetos.obterInstancia().obterObjs(cl);
		boolean erro = true; 

		if (!vetCl.isEmpty())	{
			System.out.println("\t -> Escolha um dos clientes: ");
			while (erro) {
				for (ObjetoPOO cliente : vetCl){
					System.out.println(++i + "- " + ((Cliente)cliente).getNome());
				}
				int N = Console.readInteger();
				try {cl = (Cliente)vetCl.get(N-1);} catch (Exception e) {}
				if (N > vetCl.size()) {
					System.out.println("Cliente não existe!");
					i=0;
				}
				else erro = false;
			}
		}
		else {
			System.out.println("Não existe nenhum cliente cadastrado");
			System.out.println("Cadastro de cliente:");
			cl = cadastraCliente();
		}

		return cl;
	}

	public static Tipo escolheTipo() {
		int i=0;
		Tipo tipo = new Tipo("");
		boolean erro= true;

		Vector<ObjetoPOO> vetTipo = GerenciadorObjetos.obterInstancia().obterObjs(tipo);

		if (!vetTipo.isEmpty()) {
			System.out.println("\t -> Selecione um tipo de locação:");
			while (erro) {
				for (ObjetoPOO t : vetTipo) {
					System.out.println(++i + "- " + ((Tipo)t).getNome() + ": " + ((Tipo)t).getPrecoQuilometro());
				}
				int tipoN = Console.readInteger();
				try {tipo = (Tipo)vetTipo.get(tipoN-1);} catch (Exception e) {}
				if (tipoN > vetTipo.size()) {
					System.out.println("Tipo não existe!");
					i=0;
				}
				else erro = false;
			}
		}
		else {
			tipo = cadastraTipo();
		}
		return tipo;
	}

	public static Veiculo pesquisaVeiculo() {
		String placa;
		Veiculo v;

		System.out.print("Digite a placa do Veículo(previamente cadastrado): ");
		placa = Console.readString();
		//		v = pesquisa.ObterVeiculo(placa);
		v = Pesquisa.ObterVeiculo(placa);
		if (v == null) {
			System.out.println("Veículo não existe");
			return null;
		}
		else if (!v.getLocacoes().isEmpty()) {
			if (v.getLocacoes().get(v.getLocacoes().size()-1).getValor() == 0)
			System.out.println("Veículo já possui uma locação!");
		}
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return v;
	}

	public static Veiculo escolheVeiculo() {
		int i=0;
		Veiculo veiculo = new Veiculo("");
		boolean erro= true;

		Vector<ObjetoPOO> vet = GerenciadorObjetos.obterInstancia().obterObjs(veiculo);

		if (!vet.isEmpty()) {
			System.out.println("\t -> Selecione um veículo");
			while (erro) {
				for (ObjetoPOO v : vet) {
					System.out.println(++i + "- " + ((Veiculo)v).getMarca() + ": " + ((Veiculo)v).getModelo());
				}
				int veiculoN = Console.readInteger();
				try {veiculo = (Veiculo)vet.get(veiculoN-1);} catch (Exception e) {}
				if (veiculoN > vet.size()) {
					System.out.println("Veículo não existe!");
					i=0;
				}
				else if (!veiculo.getLocacoes().isEmpty()) {
					if (veiculo.getLocacoes().get(veiculo.getLocacoes().size()-1).getValor() == 0)
						System.out.println("Veiculo já possui uma locação!");
				}
				else if (veiculo != null)
					erro = false;
			}
		}
		else {
			System.out.println("Não existem veículo cadastrados.");
			System.out.println("Cadastro de Veículo: ");
			veiculo = cadastraVeiculo();
		}
		return veiculo;

	}

	public static void deletaCliente() {
		Cliente cliente = escolheCliente();
		if (cliente != null)
			Verifica.dependenciaCliente(cliente.getNome());
	}

	public static boolean deletaMotorista(){
		boolean erro;
		Motorista mot;

		mot = escolheMotorista();
		erro = Pesquisa.removeMotorista(mot.getCNH());
		if (!erro) {
			System.out.println("Motorista não existe!");
			return false;
		}
		else {
			System.out.println("Motorista removido com sucesso!");
			System.out.println("\n-- Pressione ENTER para continuar --");
			Console.readChar();
		}

		return true;
	}

	public static boolean deletaFuncionario() {
		boolean erro;

		System.out.print("Digite o CPF do Funcionário: ");
		erro = Pesquisa.removeFuncionario(Console.readString());
		if (!erro) {
			System.out.println("Funcionário não existe!");
			return false;
		}
		else
			System.out.println("Funcionário deletado !!");
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();

		return true;
	}

	public static boolean deletaVeiculo() {
		boolean erro;

		erro = Pesquisa.removeVeiculo(escolheVeiculo().getPlaca());
		if (!erro) {
			System.out.println("Veículo não existe!");
			System.out.println("\n-- Pressione ENTER para continuar --");
			Console.readChar();
			return false;
		}
		System.out.println("Veículo removido com sucesso!\n\n-- Pressione ENTER para continuar --");
		Console.readChar();
		return true;
	}

	public static void printCliente(Cliente cliente)	{
		System.out.println("\nCLIENTE:\n");
		System.out.println("Nome 		: "+cliente.getNome());
		System.out.println("CPF  		: "+cliente.getCpf());
		System.out.println("Endereço	: "+cliente.getEndereco());
		System.out.println("Telefone	: "+cliente.getTelefone());	
	}

	public static void printVetorVeiculo(Vector<Veiculo> veiculos) {
		int i=0;
		for (Veiculo v : veiculos) {
			System.out.println(++i + "- " + ((Veiculo)v).getMarca() + ": " + ((Veiculo)v).getModelo());
		}
	}

	public static void printVetorLocacao(Vector<Locacao> locacoes) {
		int i=0;
		if (!locacoes.isEmpty()) {
			for (Locacao loc : locacoes) {
				System.out.println(++i + "- " + loc.getLocador().getNome() + " : " + loc.getVeiculo().getPlaca()+" : "+loc.getDataSaida());
			}
		}
		else {
			System.out.println("Não exite!");
		}
		
		System.out.println("\n-- Pressione ENTER para continuar --");
		Console.readChar();
	}

	public static void veiculosCategoria() {
		String nomeTipo;
		System.out.println("Digite o nome da categoria a ser pesquisada");
		nomeTipo = Console.readString();
		printVetorVeiculo(Pesquisa.veiculosCategoria(nomeTipo));
	}
}

